package com.hwua.serviceimpl;

import com.hwua.dao.UserDao;
import com.hwua.daoimpl.UserDaoImpl;
import com.hwua.domain.User;
import com.hwua.service.UserService;
import com.hwua.util.ConnectionTools;
import com.hwua.util.TableInformationTools;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户业务行为实现类
 * @author Administrator
 */
public class UserServiceImpl implements UserService {
    private Connection connection;
    /**
     * 用户登录
     * @param name
     * @param pwd
     * @return
     */
    @Override
    public List<User> login(String name, String pwd) {
        //声明一个集合，用于存放从数据库中查到的用户对象
        List<User> userList=null;
        try {
            //获取连接工具对象
            ConnectionTools tools = ConnectionTools.GetConnection.INSTANCE.getInstance();
            //获取连接
            connection = tools.getConnection();
            //关闭事务自动提交
            connection.setAutoCommit(false);
            //调用dao中的查找方法,通过UserDaoImpl类的构造方法将获取到的数据库连接传入
            UserDao ud = new UserDaoImpl(connection);
            //调用查找方法，将sql语句传入
            userList = ud.query("select user_id,user_name,user_pwd,user_level from c_user where user_name=? and user_pwd=?",rSet -> {
                List<User> list = new ArrayList<>();
                while (rSet.next()){
                    User user = new User();
                    user.setUserId(rSet.getInt(TableInformationTools.User.USER_ID));
                    user.setUserName(rSet.getString(TableInformationTools.User.USER_NAME));
                    user.setUserPwd(rSet.getString(TableInformationTools.User.USER_PWD));
                    user.setUserLevel(rSet.getInt(TableInformationTools.User.USER_LEVEL));
                    list.add(user);
                }
            return list;
            },name,pwd);
            //提交事务
            connection.commit();
            //关闭连接
            tools.closeConnection(connection);
        } catch (Exception e) {
            try {
                //如果出现异常，事务回滚
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        //返回查询到的用户信息集合的长度是否大于零，如果为真则代表找到相匹配的用户名和密码
        return userList;
    }
    /**
     * 用户注册
     * @param name
     * @param pwd
     * @return
     */
    @Override
    public boolean register(String name,String pwd) {
        //声明一个集合，用于存放从数据库中查到的用户对象
        List<User> userList=null;
        int result=0;
        try {
            //获取连接工具对象
            ConnectionTools tools = ConnectionTools.GetConnection.INSTANCE.getInstance();
            //获取连接
            connection = tools.getConnection();
            //关闭事务自动提交
            connection.setAutoCommit(false);
            //获取userDao对象，并将获取到的连接传入
            UserDao ud = new UserDaoImpl(connection);
            //调用query方法，查找数据库中是否存在当前键盘录入的用户名
            userList = ud.query("select user_name,user_pwd from c_user where user_name=? ",rSet -> {
                List<User> list = new ArrayList<>();
                while (rSet.next()){
                    User user = new User();
                    user.setUserName(rSet.getString(TableInformationTools.User.USER_NAME));
                    user.setUserPwd(rSet.getString(TableInformationTools.User.USER_PWD));
                    list.add(user);
                }
                return list;
            },name);
            //如果通过键盘录入的用户名查找返回的集合长度等于0. 说明没有查找相同的用户名
            if(userList.size()==0){
                //调用update方法,向数据库插入注册信息，返回受影响的行数
                result = ud.update("insert into c_user(user_id,user_name,user_pwd)" +
                        " values(user_id_seq.nextval,?,?)", name, pwd);
            }
            //提交事物
            connection.commit();
            //关闭连接
            tools.closeConnection(connection);
        } catch (Exception e) {
           e.printStackTrace();
        }
        return result!=0;
    }
    /**
     * 查看所有用户
     */
    @Override
    public List<User> showUserInformation(){
        List<User> userList=null;
        try {
            //获取连接工具对象
            ConnectionTools tools = ConnectionTools.GetConnection.INSTANCE.getInstance();
            //获取连接
            connection = tools.getConnection();
            //关闭事务自动提交
            connection.setAutoCommit(false);
            //调用dao中的查找方法,通过UserDaoImpl类的构造方法将获取到的数据库连接传入
            UserDao ud = new UserDaoImpl(connection);
            //调用查找方法，将sql语句传入
            userList = ud.query("select * from c_user ",rSet -> {
                List<User> list = new ArrayList<>();
                while (rSet.next()){
                    User user = new User();
                    user.setUserId(rSet.getInt(TableInformationTools.User.USER_ID));
                    user.setUserName(rSet.getString(TableInformationTools.User.USER_NAME));
                    user.setUserPwd(rSet.getString(TableInformationTools.User.USER_PWD));
                    user.setUserLevel(rSet.getInt(TableInformationTools.User.USER_LEVEL));
                    user.setAdmin(rSet.getInt(TableInformationTools.User.IS_ADMIN));
                    list.add(user);
                }
                return list;
            });
            //提交事务
            connection.commit();
            //关闭连接
            tools.closeConnection(connection);
        } catch (Exception e) {
            try {
                //如果出现异常，事务回滚
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return userList;
    }
    /**
     * 根据用户id修改用户等级
     */
    @Override
    public boolean alterUserLevel(int id,int level){
        //声明一个集合，用于存放从数据库中查到的用户对象
        List<User> userList=null;
        int result=0;
        try {
            //获取连接工具对象
            ConnectionTools tools = ConnectionTools.GetConnection.INSTANCE.getInstance();
            //获取连接
            connection = tools.getConnection();
            //获取userDao对象，并将获取到的连接传入
            UserDao ud = new UserDaoImpl(this.connection);
            //调用update方法,修改数据库信息，返回受影响的行数
            result = ud.update("update c_user set user_level=? where user_id=?",level,id);
            //关闭连接
            tools.closeConnection(this.connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result!=0;
    }
}
